gdk: Add GDK_RENDERING environment variable
authorBenjamin Otte <otte@redhat.com>
Fri, 11 Mar 2011 00:10:37 +0000 (01:10 +0100)
committerBenjamin Otte <otte@redhat.com>
Fri, 11 Mar 2011 01:10:47 +0000 (02:10 +0100)
It's useful for debugging rendering issues, both correctness and
performance wise.

See the added documentation for what it does and how it works.

docs/reference/gtk/running.sgml
gdk/gdk.c
gdk/gdkglobals.c
gdk/gdkinternals.h
gdk/gdkwindow.c

index 899f765c57dcdf3a51b522ceec7d1d5bf6bd72f1..cdb8fb09459f8187fcba11304ca4cafd077ded3c 100644 (file)
@@ -381,6 +381,41 @@ nevertheless.
   </para>
 </formalpara>
 
+<formalpara>
+  <title><envar>GDK_RENDERING</envar></title>
+
+  <para>
+    If set, selects the way how GDK creates similar surfaces. This affects both the
+    functionality of the function gdk_window_create_similar_surface() as well as the
+    way GDK creates backing surfaces for double buffering. The following values can
+    be used:
+    <variablelist>
+
+      <varlistentry>
+        <term>similar</term>
+        <listitem><para>Create similar surfaces to the window in use. This is the
+          default behavior when the variable is not set.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>image</term>
+        <listitem><para>Always create image surfaces. This essentially turns off
+          all hardware acceleration inside GTK.</para></listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>recording</term>
+        <listitem><para>Always create recording surfaces. This causes bare rendering
+          to the backend without the creation of intermediate surfaces (Pixmaps in X)
+          and will likely cause flicker.</para></listitem>
+      </varlistentry>
+
+    </variablelist>
+    All other values will be ignored and fall back to the default behavior. More
+    values might be added in the future. 
+  </para>
+</formalpara>
+
 <formalpara>
   <title><envar>GDK_BACKEND</envar></title>
 
index 43d45f50d2720325f6618a8f117319bf3c3f6611..16b4e74ca536081f30644c2b26cfdfc69b143b54 100644 (file)
--- a/gdk/gdk.c
+++ b/gdk/gdk.c
@@ -215,6 +215,8 @@ gdk_add_option_entries_libgtk_only (GOptionGroup *group)
 void
 gdk_pre_parse_libgtk_only (void)
 {
+  const char *rendering_mode;
+
   gdk_initialized = TRUE;
 
   /* We set the fallback program class here, rather than lazily in
@@ -241,6 +243,17 @@ gdk_pre_parse_libgtk_only (void)
       g_unsetenv ("GDK_NATIVE_WINDOWS");
     }
 
+  rendering_mode = g_getenv ("GDK_RENDERING");
+  if (rendering_mode)
+    {
+      if (g_str_equal (rendering_mode, "similar"))
+        _gdk_rendering_mode = GDK_RENDERING_MODE_SIMILAR;
+      else if (g_str_equal (rendering_mode, "image"))
+        _gdk_rendering_mode = GDK_RENDERING_MODE_IMAGE;
+      else if (g_str_equal (rendering_mode, "recording"))
+        _gdk_rendering_mode = GDK_RENDERING_MODE_RECORDING;
+    }
+
   g_type_init ();
 
   /* Do any setup particular to the windowing system */
index 32a02533fe4160dcb98c7ee379e497289de0d974..a9b642997e5b901fd57e53a1c1bffa67e06ed94b 100644 (file)
 #include "config.h"
 
 #include "gdktypes.h"
-#include "gdkprivate.h"
+#include "gdkinternals.h"
 
 #include <stdio.h>
 
-
 guint               _gdk_debug_flags = 0;
 GList              *_gdk_default_filters = NULL;
 gchar              *_gdk_display_name = NULL;
 gchar              *_gdk_display_arg_name = NULL;
 gboolean            _gdk_disable_multidevice = FALSE;
-
+GdkRenderingMode    _gdk_rendering_mode = GDK_RENDERING_MODE_SIMILAR;
index 790763b3613d7da735e886fa589263395794b063..4fd8129fa899820fe024a582a17c5c7ca09b5785 100644 (file)
@@ -87,10 +87,17 @@ typedef enum {
   GDK_DEBUG_EVENTLOOP     = 1 << 10
 } GdkDebugFlag;
 
+typedef enum {
+  GDK_RENDERING_MODE_SIMILAR = 0,
+  GDK_RENDERING_MODE_IMAGE,
+  GDK_RENDERING_MODE_RECORDING
+} GdkRenderingMode;
+
 extern GList            *_gdk_default_filters;
 extern GdkWindow        *_gdk_parent_root;
 
 extern guint _gdk_debug_flags;
+extern GdkRenderingMode    _gdk_rendering_mode;
 
 #ifdef G_ENABLE_DEBUG
 
index e3177f01fb674cc757125d5f4bf1e74471b8daee..8a5c87d32df98881a11870e68426319dff721bcf 100644 (file)
@@ -9709,9 +9709,26 @@ gdk_window_create_similar_surface (GdkWindow *     window,
   
   window_surface = _gdk_window_ref_cairo_surface (window);
 
-  surface = cairo_surface_create_similar (window_surface,
-                                          content,
-                                          width, height);
+  switch (_gdk_rendering_mode)
+  {
+    case GDK_RENDERING_MODE_RECORDING:
+      {
+        cairo_rectangle_t rect = { 0, 0, width, height };
+        surface = cairo_recording_surface_create (content, &rect);
+      }
+      break;
+    case GDK_RENDERING_MODE_IMAGE:
+      surface = cairo_image_surface_create (content == CAIRO_CONTENT_COLOR ? CAIRO_FORMAT_RGB24 :
+                                            content == CAIRO_CONTENT_ALPHA ? CAIRO_FORMAT_A8 : CAIRO_FORMAT_ARGB32,
+                                            width, height);
+      break;
+    case GDK_RENDERING_MODE_SIMILAR:
+    default:
+      surface = cairo_surface_create_similar (window_surface,
+                                              content,
+                                              width, height);
+      break;
+  }
 
   cairo_surface_destroy (window_surface);